"""
@author: j.l.liu
@create: 
@description:  命令行先执行：uvicorn main:app --reload

"""
from typing import Optional
from fastapi import FastAPI, Query, Path
from pydantic import BaseModel

# 创建一个app实例
app = FastAPI()


class InputData(BaseModel):
    input_text: str


# 路径操作装饰器和路径操作函数
@app.get("/")
async def root():
    # 函数返回值可以是dict、list、str、int、或者Pydantic模型
    return {"message": "hello"}


@app.post("/submit/")
async def submit_data(data: InputData):
    return {"message": f"提交文本是：{data.input_text}"}


@app.get("/read/")
async def read_root():
    return {"Hello": "World"}


# 1.1 声明路径参数item_id：使用python格式字符串语法，传递给路径函数的参数item_id
@app.get("/items/{item_id}")
async def read_item(item_id: int):
    return {"item_id": item_id}


# 1.2 查询参数（Query参数）：声明参数不是路径参数，路径操作函数会把该参数自动解释为查询参数
fake_items_db = [{"item_name": "Foo"}, {"item_name": "Bar"}, {"item_name": "Baz"}]


@app.get("/items/")
async def read_item(skip: int = 0, limit: int = 10):
    return fake_items_db[skip:skip + limit]


# 1.3 请求体（request body），客户端向api发送数据POST（最常用）、PUT/DELETE/PATCH
# Pydantic模型
class Item(BaseModel):
    name: str
    description: Optional[str] = None
    price: float
    tax: Optional[float] = None


@app.post("/items")
async def create_item(item: Item):
    return item


# 1.4 为查询参数添加验证
@app.get("/items/")
async def read_items1(q: str = Query('hello world', max_length=50)):
    results = {"items": 'Big project'}
    if q:
        results.update({"q": q})  # 给字典results添加一个健值对{"q": q}
    return results


# 1.5 混合使用Path/Query和请求体参数
@app.put("/items/{item_id}")
async def update_item(
        *,
        # 路径参数
        item_id: int = Path(..., title="The ID of the item to get", ge=0, le=1000),
        # 查询参数
        q: str = None,
        # 请求体参数
        item: Item = None,
):
    results = {"item_id": item_id}
    if q:
        results.update({"q": q})
    if item:
        results.update({"item": item})
    return results
